package lecode;

/**
 * 示例 1：
 * 输入：nums = [3,2,2,3], val = 3
 * 输出：2, nums = [2,2,_,_]
 * 解释：你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
 * 你在返回的 k 个元素之外留下了什么并不重要（因此它们并不计入评测）。
 *
 * 输入：nums = [0,1,2,2,3,0,4,2], val = 2
 * 输出：5, nums = [0,1,4,0,3,_,_,_]
 * 解释：你的函数应该返回 k = 5，并且 nums 中的前五个元素为 0,0,1,3,4。
 * 注意这五个元素可以任意顺序返回。
 *
 * 双指针法：
 * 左指针重不等于val值开始，右指针重等于val开始，然后交换值，知道左指针=右指针
 *
 */
public class 移除元素27 {
    public static void main(String[] args) {
       /* int[] nums1 = {3,2,2,3};
        System.out.println(removeElement(nums1,3));
        System.out.println(removeElement(nums1,2));
        int[] nums2 = {0,1,2,2,3,0,4,2};
        System.out.println(removeElement(nums2,2));
        System.out.println(removeElement(nums2,3));*/

        int[] nums1 = {3,2,2,3};
        System.out.println(removeElement2(nums1,3));
//        System.out.println(removeElement2(nums1,2));
    }


    /**
     * 双指针法：
     *  * 左指针重不等于val值开始，右指针重等于val开始，然后交换值，知道左指针=右指针
     *  输入3
     *  3,  2,  2,  3
     *      l       r
     *  3   3   2    2
     *          l=r
     *          return l
     * 输入2
     * 3,  2,  2,  3
     * l       r
     * 2   2   3   3
     *         l=r
     */
    public static int removeElement(int[] nums, int val) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int l = 0;
        int r = nums.length - 1;

        while (l < r ) {
            //
            while (l < r && nums[l] != val) {
                l++;
            }
            while (l < r && nums[r] == val) {
                r--;
            }
            //交换数据
            int temp = nums[l];
            nums[l] = nums[r];
            nums[r] = temp;
        }

        return nums[l] == val ? l  : l + 1;
    }

    /**
     * 输入3
     * 1:
     * 3,     2,    2,     3
     * l=r
     * 2:
     * 3      2     2      3
     * l      r 2!=3
     * 2      3     2      3
     *        l
     * 3:
     * 2      3     2      3
     *        l     r 2!=3
     * 2      2     3      3
     *              l
     * 4:
     * 2      2     3      3
     *              l      r
     */
    public static int removeElement2(int[] nums, int val) {
        //从0开始的双指针，不=val就交换，l++
        int l = 0;
        for (int r = 0; r < nums.length; r++) {
            if (nums[r] != val) {
                nums[l] = nums[r];
                l++;
            }
        }
        return l;
    }

}
